#ifndef BUFFER_H
#define BUFFER_H

#include <stdint.h>  // 仅使用基本类型定义

typedef struct {
    uint8_t* buffer;     // 数据存储区指针
    uint16_t capacity;   // 队列总容量
    uint16_t head;       // 头指针（写入位置）
    uint16_t tail;       // 尾指针（读取位置）
    uint16_t count;      // 当前元素数量
} RingBuffer_t;

// 初始化环形队列
void RingBuffer_Init(RingBuffer_t* rb, uint8_t* buffer, uint16_t capacity);

// 清空队列
void RingBuffer_Clear(RingBuffer_t* rb);

// 检查队列是否为空
uint8_t RingBuffer_IsEmpty(const RingBuffer_t* rb);

// 检查队列是否已满
uint8_t RingBuffer_IsFull(const RingBuffer_t* rb);

// 获取队列当前元素数量
uint16_t RingBuffer_Count(const RingBuffer_t* rb);

// 向队列写入一个字节（返回0表示失败）
uint8_t RingBuffer_WriteByte(RingBuffer_t* rb, uint8_t data);

// 从队列读取一个字节（返回0表示失败）
uint8_t RingBuffer_ReadByte(RingBuffer_t* rb, uint8_t* data);

// 批量写入数据（返回实际写入的字节数）
uint16_t RingBuffer_Write(RingBuffer_t* rb, const uint8_t* data, uint16_t len);

// 批量读取数据（返回实际读取的字节数）
uint16_t RingBuffer_Read(RingBuffer_t* rb, uint8_t* data, uint16_t len);

// 查看队首数据但不出队（返回0表示失败）
uint8_t RingBuffer_Peek(const RingBuffer_t* rb, uint8_t* data);

#endif // RING_BUFFER_H
